import $store from '@/store'

const BASE_URL = import.meta.env.VITE_API_URL // 公共基础路径
const TIMEOUT = 60000 // 请求超时时间
/**
 * 封装 uni.request 请求
 * @param {object} options - 请求配置
 * @returns {Promise} 返回一个 Promise 对象
 */
function request(options: any) {
  // 默认配置
  const defaultOptions = {
    baseURL: BASE_URL,
    timeout: TIMEOUT,
    method: 'GET',
    header: {
      'Content-Type': 'application/json', // 默认 Content-Type
    },
  }

  // 合并用户传入的配置和默认配置
  const finalOptions = Object.assign({}, defaultOptions, options)
  finalOptions.url = finalOptions.baseURL + finalOptions.url

  return new Promise((resolve, reject) => {
    // 请求拦截器
    const token = $store('user').token // 假设从本地存储中获取 token
    if (token) {
      finalOptions.header.token = `${token}`
    }

    uni.request({
      ...finalOptions,
      success: (res: any) => {
        // 响应拦截器
        const { statusCode, data } = res

        // HTTP 状态码判断
        if (statusCode >= 200 && statusCode < 300) {
          if (data.code !== 0) {
            handleError(statusCode, data)
            reject(data)
            return
          }
          // 成功处理
          resolve(data) // 直接返回数据
        }
        else {
          // 错误处理
          handleError(statusCode, data)
          reject(data)
        }
      },
      fail: (err: any) => {
        // 网络错误或其他异常
        uni.showToast({
          title: '网络错误，请稍后重试',
          icon: 'none',
        })
        reject(err)
      },
    })
  })
}

/**
 * 统一错误处理函数
 * @param {number} statusCode - HTTP 状态码
 * @param {object} data - 响应数据
 */
function handleError(statusCode: number, data: any) {
  let errorMessage = '未知错误'

  switch (statusCode) {
    case 400:
      errorMessage = '请求参数错误'
      break
    case 401:
      errorMessage = '未授权，请登录'
      uni.reLaunch({ url: '/pages/login/login' }) // 跳转到登录页
      break
    case 403:
      errorMessage = '禁止访问'
      break
    case 404:
      errorMessage = '资源不存在'
      break
    case 500:
      errorMessage = '服务器内部错误'
      break
    default:
      errorMessage = data?.message || errorMessage
  }

  uni.showToast({
    title: errorMessage,
    icon: 'none',
  })
}

export default request
